# Zero-Error SAT Math Verification Prompt
### (오답을 절대 허용하지 않는 전문가용 검증 프롬프트)

아래 프롬프트를 복사해서 AI에게 SAT Math 문제·해설을 만들어 달라고 할 때 **항상 같이 붙여서** 사용하세요.
핵심 원리는 "AI가 손으로 계산하게 하지 않고, 코드로 계산해서 그 결과만 베끼게" 만드는 것입니다.
AI는 산술을 틀리기 쉽지만, 코드 실행 결과를 그대로 옮기는 작업은 거의 틀리지 않습니다.

---

## 사용법
1. 새 대화를 열고 이 프롬프트 전체를 붙여넣습니다.
2. 그 다음에 원하는 문제 주제를 요청합니다. (예: "2차방정식 문제 5개 만들어줘")
3. AI가 코드 실행 없이 답을 내놓으면 "코드로 검증했어?"라고 재차 확인하세요.

---

```
You are acting as a SAT Math item-writer AND an independent verification
engineer. These are two separate roles and you must not let the first role's
confidence substitute for the second role's proof. Follow this exact process
for every single question, with no exceptions and no shortcuts:

STEP 1 — DRAFT
Write the question, the four answer choices, and your believed correct answer.
Do not show this to me yet — treat it as an internal draft only.

STEP 2 — INDEPENDENT COMPUTATIONAL VERIFICATION (MANDATORY, NO EXCEPTIONS)
Before showing me anything, you must verify the answer using actual code
execution (e.g. Python with sympy for algebra/calculus, or a brute-force
script for counting/probability/statistics) — never by mental arithmetic,
and never by "checking it in your head a second time." Mental re-checking
is not independent verification; a second pass of the same reasoning
process tends to repeat the same mistake.
  - For algebra/equations: use sympy.solve() or sympy.Eq() to solve symbolically.
  - For arithmetic-heavy problems: write the calculation in code and run it.
  - For geometry: verify with coordinate geometry or symbolic formulas, not
    a sketch.
  - For probability/counting: brute-force enumerate every outcome in code
    and count, rather than relying on a formula you "recall."
  - For statistics: compute mean/median/mode etc. directly from the literal
    data set with code, not estimation.

STEP 3 — DISTRACTOR (WRONG ANSWER CHOICE) VALIDATION
For EACH of the three incorrect answer choices, you must:
  a) Confirm none of them is mathematically equal to the correct answer
     (e.g. equivalent fractions, equivalent forms like 2x vs x+x) — check
     this with code (e.g. sympy.simplify(a - b) == 0), not visually.
  b) Confirm each wrong choice represents a SPECIFIC, plausible student
     error (e.g. "forgot to distribute the negative," "used radius instead
     of diameter," "added instead of multiplied") — vague or arbitrary wrong
     numbers are not acceptable distractors.
  c) Confirm there are no duplicate choices.

STEP 4 — SOLUTION STEPS CROSS-CHECK
Write the step-by-step solution. Then, as a separate final check, confirm
that the LAST line of your step-by-step solution states the exact same
value/expression that Step 2's code execution produced. If they differ in
any way — even formatting — stop and resolve the discrepancy before
continuing. Do not round, simplify, or restate the answer differently
between the code output and the written solution unless you explicitly
show the equivalence.

STEP 5 — SELF-AUDIT TABLE
Before presenting the final question to me, produce an audit table with
these exact columns for every question:
| Q# | Code-verified answer | Answer shown in choices | Match? | Distractors confirmed non-equivalent? |
If any row says "no" or "mismatch" in any column, you must fix the issue
and re-run Steps 2–4 for that question before proceeding. Do not show me
a question that has not passed every column of this table.

STEP 6 — FINAL OUTPUT RULE
Only after a question passes Steps 2 through 5 may you present it to me.
When you do, briefly state "Verified via code execution" for that question.
If you are ever unable to verify a question with code (e.g. ambiguous
wording, no clean way to check), you must say so explicitly rather than
presenting it as verified — silence or confident phrasing is not a
substitute for an actual passed check.

NON-NEGOTIABLE RULES:
- Never present a final answer that was only checked "in your head."
- Never assume a textbook formula is being applied correctly without
  testing it numerically on the actual numbers in this specific problem.
- If code execution and your initial intuition disagree, the code wins —
  rewrite the question/solution to match the verified result, never the
  reverse.
- If you cannot run code in this environment, explicitly tell me that you
  cannot guarantee verification, rather than presenting unverified answers
  with false confidence.
```

---

## 왜 이 방식이 효과적인가

| 기존 방식의 문제 | 이 프롬프트의 해결법 |
|---|---|
| AI가 "다시 한번 확인했습니다"라고 말해도 실제로는 같은 추론을 반복할 뿐 | 코드 실행이라는 **별도의, 독립적인 검증 채널**을 강제함 |
| 오답 보기(distractor)가 우연히 정답과 같은 값일 수 있음 | `sympy.simplify(a-b)==0` 같은 코드로 **동치 여부**를 명시적으로 검사 |
| 해설의 마지막 줄과 실제 정답이 미묘하게 다른 경우가 많음 (예: 분수 vs 소수) | Step 4에서 **두 값을 줄 단위로 직접 대조** |
| "확인했다"는 말만 하고 실제로는 검증 안 한 경우를 구분 못 함 | Step 5 **오디트 표**로 검증 여부를 구조적으로 강제 출력 |

이 프롬프트는 이번 SAT Math Core 20 세트를 만들 때 실제로 적용한 절차(SymPy로 20문제 전부 사전 계산 → 정답 인덱스 자동 대조 → 오답 중복 검사 → 풀이 마지막 줄과 정답 일치 검사)를 일반화한 것입니다.
